# Auther：wujehy
# email:wujehy@qq.com
# @File : ToolUnit.py 
# @Time : 19-6-19 下午9:48
import base64
import time


class ToolUnit():
    def retTag(self, data=None, Type=False):
        """
        组装 返回信息 给浏览器

        :param data: 字典格式 的 数据
        :param Type:  选择 功能
        :return: 返回状态 的 字典
        """
        ret=dict()
        if Type:
            ret["status"] = "success"
        else:

            ret["status"] = "error"


        if data is not None:
            ret["result"] = data

        ret["time"]= self.TimeNow()

        return ret

    def TimeNow(self, Type=False):
        if Type:
            return int(time.time())
        else:
            return str(time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime()))

    def SensorNamebyAppidAndID(self, Appid: int, id: int):
        """
        datasheet 是 传感器的 信息表

        功能 通过 id 获得 传感器的 名字 name
        :param Appid: 传过来的 拼接 的appid
        :param id: 所在 信息位
        :return:
        """
        try:
            return self.dataSheet["id_%s:%s" % (hex(Appid), id)]["name"]
        except:
            return "id_0x%s:%s" % (hex(Appid)[2:6], id)

    def SensorNamebyAppid_id(self, Appid_id):
        """
        datasheet 是 传感器的 信息表

        功能 通过 id 获得 传感器的 名字 name
        :param Appid: 传过来的 拼接 的appid
        :param id: 所在 信息位
        :return:
        """
        try:
            return self.dataSheet["id_%s" % Appid_id]["name"]
        except:
            return "id_%s" % Appid_id

    def byteinData(self, src, len, new):
        """
        指定 byte 的替换 因为 替换某个值 byte 不像数组 不能直接操作
        所以 遍历出来 在 修改 转化
        :param src: 源数据
        :param len: 位置
        :param new: 新值
        :return:
        """
        # 我的骚操作
        out = [(x == len and new or src[x]) for x in range(src.__len__())]
        # 等价
        # out=[x for x in src]
        # for x in range(src.__len__()):
        #     if x == len:
        #         out[x]=new

        return bytes(out)

    def base64encode(self, data):
        """
        输入的是byte
        将二进制格式转化成 字符
        :param data:
        :return:
        """
        return base64.encodebytes(data)

    def base64decode(self, data):
        """
        输入的是byte

        将字符转化 二进制
        :param data:
        :return:
        """
        return base64.decodebytes(data)

    def sensorUnit(self, sensorType):

        try:
            sensor = self.dataSheet[sensorType]
            # 浮点型
            return sensor["unit"]
        except:
            return ""

    def sensorValue(self, sensorType, value):
        """
        将　传感器的值　处理成　具体数值的方式　
        :param type: 类型　
        :param value: value　就是　０ｘ１２．０ｘ３４　这样　类型的数据　前　是　整数部分　后是　小数部分
                    　　ａｄｃ　就是　这两个　数据是　ａｄｃ　直接　换算
        :return:　返回真实数据
        """
        try:
            sensor = self.dataSheet[sensorType]
            # 浮点型
            if sensor["type"] is "float":
                return float("%s.%s" % ((value & 0xff00) >> 8, value & 0xff))
            elif sensor["type"] is "adc":
                return (value / sensor["power"]) * (sensor["max"] - sensor["min"]) + sensor["min"]
            elif sensor[type] is "Test":
                # 测试
                return value
        except:
            return value

    def get_client_ip(self,request):
        try:
            real_ip = request.META['HTTP_X_FORWARDED_FOR']
            regip = real_ip.split(",")[0]
        except:
            try:
                regip = request.META['REMOTE_ADDR']
            except:
                regip = ""

        return regip